package com.pennywise.service;

import com.pennywise.model.CategoryStats;
import com.pennywise.model.ChatMessage;
import com.pennywise.model.UserProfile;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * AI分析服务
 * 使用AI分析用户的消费情况并提供建议
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AIService {

    @Resource
    private OpenAiChatModel chatClient;

    private final TransactionService transactionService;
    private final UserProfileService userProfileService;
    
    // 存储对话历史
    private final List<Map<String, String>> chatHistory = new ArrayList<>();
    
    /**
     * 分析用户消费情况并生成建议
     *
     * @return AI生成的分析建议
     */
    public String analyzeSpending() {
        log.info("开始分析用户消费情况");
        
        UserProfile profile = userProfileService.getCurrentProfile();
        log.debug("获取到用户配置: {}", profile);
        
        LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0);
        List<CategoryStats> stats = transactionService.getCategoryStats("支出", startOfMonth, LocalDateTime.now());
        log.debug("获取到消费统计: {}", stats);
        
        BigDecimal totalSpending = stats.stream()
                .map(CategoryStats::getTotal)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        log.debug("计算得到总支出: {}", totalSpending);
        
        String promptContent = generatePromptContent(profile, totalSpending, stats);
        log.debug("生成AI提示: {}", promptContent);
        
        Message systemMessage = new SystemMessage("""
            你是一个专业的理财顾问，擅长分析个人消费情况并提供实用的理财建议。
            请使用专业但易懂的语言，给出具体可行的建议。
            建议应该是积极的、建设性的，避免过于苛刻或否定性的评价。
            请用中文回复。
            """);
            
        Message userMessage = new UserMessage(promptContent);
        
        String response = chatClient.call(systemMessage, userMessage);
        log.info("AI分析完成，生成建议长度: {}", response.length());
        
        // 保存对话历史
        Map<String, String> conversation = new HashMap<>();
        conversation.put("question", promptContent);
        conversation.put("answer", response);
        conversation.put("time", LocalDateTime.now().toString());
        chatHistory.add(conversation);
        
        // 只保留最近的10条记录
        if (chatHistory.size() > 10) {
            chatHistory.remove(0);
        }
        
        return response;
    }
    
    /**
     * 获取对话历史
     */
    public List<Map<String, String>> getHistory() {
        return new ArrayList<>(chatHistory);
    }
    
    /**
     * 处理用户聊天消息
     *
     * @param message 用户消息
     * @return AI的回复
     */
    public ChatMessage processMessage(ChatMessage message) {
        log.info("处理用户消息: {}", message.getMessage());
        
        Message systemMessage = new SystemMessage("""
            你是一个专业的理财顾问助手，可以回答用户关于个人理财的各种问题。
            请使用专业但易懂的语言回答问题。
            回答应该是具体的、有建设性的，并尽可能提供可行的建议。
            请用中文回复。
            """);
            
        Message userMessage = new UserMessage(message.getMessage());
        
        String response = chatClient.call(systemMessage, userMessage);
        log.info("AI回复生成完成，长度: {}", response.length());
        
        // 保存对话历史
        Map<String, String> conversation = new HashMap<>();
        conversation.put("question", message.getMessage());
        conversation.put("answer", response);
        conversation.put("time", LocalDateTime.now().toString());
        chatHistory.add(conversation);
        
        // 只保留最近的10条记录
        if (chatHistory.size() > 10) {
            chatHistory.remove(0);
        }
        
        // 创建并返回ChatMessage对象
        ChatMessage responseMessage = new ChatMessage();
        responseMessage.setMessage(response);
        responseMessage.setType("assistant");
        responseMessage.setTimestamp(LocalDateTime.now().toString());
        
        return responseMessage;
    }
    
    /**
     * 生成AI分析提示内容
     */
    private String generatePromptContent(UserProfile profile, BigDecimal totalSpending, List<CategoryStats> stats) {
        return String.format("""
            请分析以下用户的消费情况并给出建议：
            
            基本情况：
            - 月收入：%.2f元
            - 本月总支出：%.2f元
            - 年度存款目标：%.2f元
            
            本月各类支出：
            %s
            
            请从以下几个方面进行分析和建议：
            1. 支出是否合理，支出结构是否健康
            2. 如何优化各类支出，哪些支出可以适当减少
            3. 如何调整收支习惯来实现年度存款目标
            4. 根据支出情况，有什么理财建议
            
            请用中文给出具体、可操作的建议。
            """,
            profile.getMonthlySalary(),
            totalSpending,
            profile.getYearEndTarget(),
            formatCategoryStats(stats)
        );
    }
    
    /**
     * 格式化分类统计信息
     */
    private String formatCategoryStats(List<CategoryStats> stats) {
        if (stats.isEmpty()) {
            return "暂无支出记录";
        }
        
        return stats.stream()
                .map(stat -> String.format("- %s: %.2f元", stat.getCategory(), stat.getTotal()))
                .collect(Collectors.joining("\n"));
    }
}